package com.crm.service.index;


import com.crm.model.vo.index.PerformanceStatisticsVO;
import com.crm.model.vo.index.ProductVO;
import com.crm.model.vo.index.RankingVO;
import com.crm.model.vo.opportunityManager.PerformanceRankingVO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 首页信息
 */
public interface FirstPageDbService {

    /**
     * 查询用户下的客户会员数量
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    Integer selectCustomerMembershipNumber(String accountId, Integer dateUnit);

    /**
     * 查询用户下的联系人数
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    Integer selectContactNumber(String accountId, Integer dateUnit, String companyId);

    /**
     * 查询用户下的商机数
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    Integer selectOpportunityNumber(String accountId, Integer dateUnit);

    /**
     * 查询用户的电话总时长
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    Integer selectTotalTelehoneHours(String accountId, Integer dateUnit);

    /**
     * 查询用户的提成总金额
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    BigDecimal selectRoyaltyMoneyTotal(String accountId, Integer dateUnit);

    /**
     * 查询用户7天未联系的客户数量
     *
     * @param accountId 用户id
     * @param pastDate  7天前的日期
     * @return
     */
    Integer selectBeOverdueCustomerNumber(String accountId, String pastDate);

    /**
     * 查询用户7天内新增跟进
     *
     * @param accountId 用户id
     * @param pastDate  7天前的日期
     * @return
     */
    Integer selectAddFollowNumber(String accountId, String pastDate);

    /**
     * 查询用户7天内新增订单
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    Integer selectAddOrderNumber(String accountId, Integer dateUnit);

    /**
     * 查询用户7天内新增拜访
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    Integer selectAddFollowVisitNumber(String accountId, Integer dateUnit);

    /**
     * 首页统计个人业绩排行榜
     *
     * @param dateUnit  本月 1 上月 2
     * @param accountId 用户id
     * @param combination dateType 1 2021  2 202101
     * @return
     */
    List<PerformanceRankingVO> personalPerformanceRanking(Integer dateUnit, String accountId,String combination);

    /**
     * 查询用户7天内新增业绩
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    BigDecimal selectAddAchievement(String accountId, Integer dateUnit);

    /**
     * 去年统计个人业绩
     *
     * @param accountId  用户id
     * @param startMonth 开始月份
     * @return endMonth 结束月份
     */
    List<PerformanceStatisticsVO> lastPerformanceTrend(String accountId, String startMonth, String endMonth);

    /**
     * 今年统计个人业绩   近一周 1 近半年 2 近一年3
     *
     * @param accountId  用户id
     * @param startMonth 开始月份
     * @return endMonth 结束月份
     * @return
     */
    List<PerformanceStatisticsVO> thisPerformanceTrend(String accountId, String startMonth, String endMonth);

    /**
     * 产品成交排行榜
     * @param dateUnit 1年 2年月
     * @param combination dateType 1 2021  2 202101
     * @return
     */
    List<ProductVO> productTurnoverList(Integer dateUnit,String combination);

    /**
     * 根据用户id查询业绩排名
     *
     * @param dateUnit 1本月 2上个月 3本年
     * @return
     */
    RankingVO selectRanking(String accountId, Integer dateUnit);

    /**
     * 二级管理业绩排名
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    RankingVO adminSelectRanking(String companyId, Integer dateUnit);

    /**
     * 二级管理会员数量
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    Integer adminSelectCustomerMembershipNumber(String companyId, Integer dateUnit);


    /**
     * 二级管理业绩金额
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    BigDecimal adminSelectperformanceAmount(String companyId, Integer dateUnit);

    /**
     * 今年统计二级管理个人业绩
     *
     * @param companyId  公司id
     * @param startMonth 开始月份
     * @return endMonth 结束月份
     */
    List<PerformanceStatisticsVO> thisAdminPerformanceTrend(String companyId, String startMonth, String endMonth);

    /**
     * 去年统计二级管理个人业绩
     *
     * @param companyId  公司id
     * @param startMonth 开始月份
     * @return endMonth 结束月份
     */
    List<PerformanceStatisticsVO> lastAdminPerformanceTrend(String companyId, String startMonth, String endMonth);

    /**
     * 首页统计二级管理业绩排行榜
     *
     * @param dateUnit 本月 1 上月 2 本周 3 上周 4 今年 5 去年 6
     * @return
     */
    List<PerformanceRankingVO> adminCompanyPerformanceRanking(Integer dateUnit);

    /**
     * 首页统计二级管理分公司下的业绩排行榜
     *
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4 今年 5 去年 6
     * @param companyId 公司id
     * @param accountId 超级管理员id
     * @return
     */
    List<PerformanceRankingVO> adminCompanyPersonalPerformanceRanking(Integer dateUnit, String companyId, String accountId);
    /**
     * 首页统计二级管理分公司下的业绩排行榜
     *
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4 今年 5 去年 6
     * @return
     */
    List<PerformanceRankingVO> adminCompanyPersonalPerformanceRank(Integer dateUnit, String companyId, List<String> accountIds);

    /**
     * 二级管理会员增长率
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    BigDecimal selectMembershipGrowthRate(String companyId, Integer dateUnit);

    /**
     * 二级管理会员续费率
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    BigDecimal selectMembershipRenewalRate(String companyId, Integer dateUnit);

    /**
     * 二级管理会员流失率
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    BigDecimal selectMemberTurnoverRate(String companyId, Integer dateUnit);
    Integer selectMemberTurnoverCount(String companyId, Integer dateUnit);


    /**
     * 用户角色首页统计数据获取
     *
     * @param dateType
     * @return
     */
    Map<String, Object> userFirstPageContent(String dateType);

    /**
     * 普管角色查询指定时间内的所有公司的业绩排行
     * @param startDate
     * @param endDate
     * @return
     */
    List<PerformanceRankingVO> adminCompanyPerformanceRank(String startDate, String endDate);

    /**
     * 首页统计按年个人业绩
     */
    List<PerformanceRankingVO> firstPageSalesmanByYear();

    /**
     * 首页统计按年月个人业绩
     */
    List<PerformanceRankingVO> firstPageSalesmanByMonth();
}
